package cn.tedu.myioc;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

//模拟spring实现ioc --控制反转（new）
public class MyIOC {
    //1.有那些bean -- 工程里有很多类，spring都当做bean看待，都存入list查询效率要高  查询效率要高存入list
    List<Bean> beans =new ArrayList<>();
        //1.1、对象的初始化 -- 要创建对象时，早都准备好了（这里我们自己先写死）
        public MyIOC() throws Exception {
        Bean b1=new Bean("user","cn.tedu.myioc.User");
        Bean b2=new Bean("dept","cn.tedu.myioc.Dept");
        Bean b3=new Bean("order","cn.tedu.myioc.Order");
        //1.2、把准备好的bean存入list，方便后面查的快
        Collections.addAll(beans,b1,b2,b3);
        //1.3、完成ioc的过程
            init();

    }
    //准备map，存数据 -- key是类的名字 value是这个类的对象
    Map<String,Object> map=new ConcurrentHashMap<>();

    //2.给bean们创建对象  -- 控制反转IOC
    // Map<key,value> key是类的名字，value是这个类的对象
    public void init() throws Exception {
            //遍历List，获取每个bean
            for (Bean b:beans) {
            //获取每个bean身上的beanId作为key存入map
            String key=b.getBeanId();
            //获取每个bean身上的beanPath进行反射创建对象，作为value存入map
            Object value =Class.forName(b.getBeanPath()).newInstance();
            map.put(key,value);//{"user"=new User(),"dept"=new Dept()}
        }
    }
    //3.getBean（）获取对象
    public Object getBean(String leiming){
            return map.get(leiming);
    }
}
